Skip to content

2.1.0 - #54

Merged
bretttolbert merged 30 commits into
mainfrom
2.1.0-dev
Nov 8, 2026
Merged

bretttolbert merged 30 commits into
mainfrom
2.1.0-dev

Conversation

@bretttolbert

@bretttolbert bretttolbert commented Sep 4, 2026 •

Copy link
Copy Markdown
Owner

Verbecc 2.1.0 release -- Misc. modernization

Target release date: 8 November 2026

PR feedback appreciated

Most significantly:

  • Dropping support for Python 3.9 (it has been EOL for nearly a year and requires some nasty hacks I'd rather not maintain, in addition to hacks required for Py310)
  • Restructured project to use a standard src layout
    • Changed verbecc/verbecc/src to verbecc/src/verbecc
    • Changed verbecc.src to verbecc.core
  • Simplified several __init__.py files, potentially breaking some imports
  • Transitioned from pip to uv (10x to 100x faster than pip)

For detailed listing of changes see CHANGELOG

@bretttolbert
bretttolbert marked this pull request as ready for review September 5, 2026 14:53
@bretttolbert
bretttolbert marked this pull request as draft September 5, 2026 21:31
@bretttolbert
bretttolbert marked this pull request as ready for review September 6, 2026 13:27
@bretttolbert
bretttolbert requested review from peterabolins and removed request for peterabolins September 12, 2026 16:28

@peterabolins peterabolins left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tested 2.1.0 against LexicRo, which uses verbecc for Romanian.

Conjugation output: no regressions. I dumped CompleteConjugator(lang="ro").conjugate(v).to_json() for all 6,869 Romanian verbs on 2.0.3 and on this branch. Every one is byte-identical, even with the move to dataclass-wizard 1.0 and scikit-learn 1.9. The only difference is pred_score on predicted verbs (e.g. blogui 0.9978 → 0.9959), because the model is retrained under the newer scikit-learn. The chosen template and forms are the same. The #49 fixes survive the move, and #50 and #53 are unchanged, as expected.

Two things need fixing before release, though.

  1. The built wheel contains no data (blocker)

pip wheel . on this branch gives a 181-file wheel with none of verbecc/config/.yaml or verbecc/data/xml/**/.xml. A normal install fails on first use:

ModuleNotFoundError: No module named 'verbecc.config'

There are two causes:

[tool.setuptools.package-data] is keyed trained_models, which isn't a package, so the globs match nothing.
config/ and data/ have no init.py, so packages.find skips them.

CI doesn't catch this because it uses pip install -e ".[dev]", which reads the source tree directly. This fixes it:

[tool.setuptools.package-data]
verbecc = [
"py.typed",
"config/.yaml",
"data/xml/conjugations/
.xml",
"data/xml/verbs/.xml",
"data/models/
",
]

A CI step that builds the wheel, installs it into a clean venv and conjugates one verb per language would prevent this happening again.

  1. from verbecc import CompleteConjugator no longer works

src/verbecc/init.py is now empty, so the entry point shown in the README raises ImportError, and every existing consumer breaks. The changelog flags that some imports may break, but this is the main public entry point, not an internal path. It's worth keeping, and it can be kept without breaking R006 by re-exporting one level at a time:

src/verbecc/init.py

from .core import CompleteConjugator as CompleteConjugator

src/verbecc/core/init.py

from .conjugator import CompleteConjugator as CompleteConjugator

src/verbecc/core/conjugator/init.py

from .complete_conjugator import CompleteConjugator as CompleteConjugator

This loads nothing new, since CompleteConjugator pulls in the whole conjugator anyway, and there are no circular-import problems. If you'd rather make the break on purpose, please document the new path (verbecc.core.conjugator.complete_conjugator) in the README and in the changelog's breaking-changes section.

With both fixes applied, the wheel installs cleanly, all six languages conjugate, and the test suite passes (556 passed, 2 skipped).

@bretttolbert

Copy link
Copy Markdown
Owner Author

Thanks for the review @peterabolins I believe I've addressed the two blockers you mentioned. Apologies for the delay, I haven't had much free time to allocate to this project. If you don't mind, please give it a final lookover.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The XML serializer converts encoded bytes to their Python representation rather than decoding them, making generated XML unparsable and turning accented characters into literal escape sequences.

2 open issues
What changed in this PR

Verbecc 2.1.0 modernizes the package structure and development workflow while preserving the public CompleteConjugator entry point.

Changes:

  • Moves implementation and resources to a standard src layout under src/verbecc, replacing verbecc.src with verbecc.core.
  • Drops Python 3.9 support, adopts uv-based development and CI, and updates packaging and dependencies.
  • Modernizes typing and XML utilities, simplifies exports, and adds public API checks, wheel smoke tests, documentation, and branding assets.

This pull request requires changes. The unresolved findings are:

  • Critical: xml_utils.py:31 converts serialized bytes to their Python representation rather than decoding them, producing invalid XML output.
  • Moderate: complete_conjugation.py:55 fully serializes conjugations merely to iterate mood keys; use the existing public iterator.
  • Moderate: mood_conjugation_util.py:18 serializes both inputs merely to obtain tense keys, adding allocations to normal conjugation; iterate directly.
  • Moderate: tests/scripts/test_xml_modifier.py:20,31 retains old XML paths, causing FileNotFoundError when the development test is enabled.
  • Moderate: tests/test_code_style/test_imports.py:26 misses indented absolute imports in package initializers.
  • Moderate: tests/test_code_style/test_imports.py:37 can accept failed scans as successful because it checks only empty stdout, not stderr and process status.
File Description
verbecc/​src/​utils/​config/​__init__.py Removes legacy configuration exports.
verbecc/​src/​parsers/​verbs_parser.py Removes old-location verbs parser.
verbecc/​src/​parsers/​verb_parser.py Removes old-location verb parser.
verbecc/​src/​parsers/​parser.py Removes old-location parser interface.
verbecc/​src/​parsers/​mood_template_parser.py Removes old-location mood parser.
verbecc/​src/​parsers/​conjugation_template_parser.py Removes old-location template parser.
verbecc/​src/​defs/​types/​tense/​tenses.py Removes legacy tense registry.
verbecc/​src/​defs/​types/​tense/​__init__.py Removes legacy tense exports.
verbecc/​src/​defs/​types/​pronoun/​pronouns.py Removes legacy pronoun registry.
verbecc/​src/​defs/​types/​pronoun/​__init__.py Removes legacy pronoun exports.
verbecc/​src/​defs/​types/​mood/​moods.py Removes legacy mood registry.
verbecc/​src/​defs/​types/​mood/​__init__.py Removes legacy mood exports.
verbecc/​src/​defs/​types/​lang_specific_options/​__init__.py Removes legacy option exports.
verbecc/​src/​defs/​types/​exceptions/​__init__.py Removes legacy exception exports.
verbecc/​src/​defs/​types/​data/​mood_template.py Removes old-location mood template.
verbecc/​src/​defs/​types/​conjugation/​verb_info_data.py Removes legacy verb-data alias.
verbecc/​src/​defs/​types/​conjugation/​tense_conjugation_data.py Removes legacy tense-data alias.
verbecc/​src/​defs/​types/​conjugation/​moods_conjugation_data.py Removes legacy moods-data alias.
verbecc/​src/​defs/​types/​conjugation/​mood_conjugation_data.py Removes legacy mood-data alias.
verbecc/​src/​defs/​types/​conjugation/​complete_conjugation_data.py Removes legacy complete-data alias.
verbecc/​src/​defs/​types/​conjugation/​__init__.py Removes legacy conjugation exports.
verbecc/​src/​defs/​types/​config/​logging/​logging_config.py Removes old-location logging model.
verbecc/​src/​defs/​types/​config/​logging/​__init__.py Removes legacy logging exports.
verbecc/​__init__.py Removes pre-src-layout package entry point.
typings/​jsbeautifier/​__init__.pyi Adds jsbeautifier type stubs.
tox.ini Removes pip-based test configuration.
tests/​test_types/​test_verbs.py Updates imports and annotations.
tests/​test_to_json.py Updates imports and fixture typing.
tests/​test_string_utils.py Updates imports; removes obsolete compatibility test.
tests/​test_public_api.py Tests public re-exports and conjugation.
tests/​test_parser/​test_verbs_parser.py Updates parser imports.
tests/​test_parser/​test_verb_parser.py Updates imports and mock typing.
tests/​test_parser/​test_tense_and_person.py Uses shared XML type alias.
tests/​test_parser/​test_conjugation_template.py Updates imports and mock typing.
tests/​test_mlconjug.py Updates imports and public verb access.
tests/​test_localization.py Updates imports and annotations.
tests/​test_inflectors/​test_inflector_fr_to_yaml.py Updates imports and fixture typing.
tests/​test_inflectors/​test_inflector_fr_to_json.py Updates imports, helper loading, and annotations.
tests/​test_inflectors/​test_inflector_ca_to_json.py Updates imports and expected-data typing.
tests/​test_code_style/​test_imports.py Adds initializer import-style checks.
tests/​test_code_style/​test_ast.py Modernizes AST-check annotations.
tests/​scripts/​test_xml_modifier.py Converts development-test paths to Path.
tests/​common.py Annotates JSON comparison internals.
STYLE_GUIDE.md Moves standalone guidance into contributing documentation.
src/​verbecc/​resources/​icons/​README.md Documents icon conversion commands.
src/​verbecc/​resources/​icons/​logo.svg Adds source logo artwork.
src/​verbecc/​resources/​icons/​logo-android.svg Adds path-based logo variant.
src/​verbecc/​resources/​icons/​feature-graphic.svg Adds promotional graphic artwork.
src/​verbecc/​py.typed Marks the package as typed.
src/​verbecc/​data/​models/​dummy-file-because-github-doesnt-like-large-files.md Documents model-directory placeholder.
src/​verbecc/​core/​utils/​yaml_utils.py Updates commented import examples.
src/​verbecc/​core/​utils/​xml_utils.py Adds shared XML wrapper functions.
src/​verbecc/​core/​utils/​utils.py Updates model-training imports.
src/​verbecc/​core/​utils/​string_utils.py Modernizes typing; removes Python 2 compatibility.
src/​verbecc/​core/​utils/​logging_utils.py Updates logging configuration import.
src/​verbecc/​core/​utils/​json_utils.py Updates imports and typing suppression.
src/​verbecc/​core/​utils/​jsbeautifier_utils.py Updates imports and removes duplication.
src/​verbecc/​core/​utils/​dict_utils.py Modernizes recursive utility annotations.
src/​verbecc/​core/​utils/​config/​verbecc_config_util.py Updates imports and YAML result typing.
src/​verbecc/​core/​utils/​config/​logging_config_util.py Updates imports and parsed-data typing.
src/​verbecc/​core/​utils/​config/​base_config_util.py Uses standard resource APIs; removes legacy fallbacks.
src/​verbecc/​core/​utils/​config/​__init__.py Simplifies configuration package exports.
src/​verbecc/​core/​utils/​__init__.py Relocates utility package marker.
src/​verbecc/​core/​parsers/​verbs_parser.py Relocates parser and reads resource bytes.
src/​verbecc/​core/​parsers/​verb_parser.py Uses shared XML aliases and helpers.
src/​verbecc/​core/​parsers/​tense_template_parser.py Uses shared XML helpers and types.
src/​verbecc/​core/​parsers/​person_ending_parser.py Uses shared XML text and lookup helpers.
src/​verbecc/​core/​parsers/​parser.py Relocates typed parser interface.
src/​verbecc/​core/​parsers/​mood_template_parser.py Relocates parser and updates XML typing.
src/​verbecc/​core/​parsers/​conjugations_parser.py Updates resource APIs, imports, and XML typing.
src/​verbecc/​core/​parsers/​conjugation_template_parser.py Uses XML helpers; corrects error interpolation.
src/​verbecc/​core/​parsers/​__init__.py Relocates parser package marker.
src/​verbecc/​core/​mlconjug/​predictor.py Updates imports and probability-call typing.
src/​verbecc/​core/​mlconjug/​model.py Modernizes typing and model representation.
src/​verbecc/​core/​mlconjug/​model_utils.py Updates imports and resource APIs.
src/​verbecc/​core/​mlconjug/​mltypes.py Defines relocated ML type aliases.
src/​verbecc/​core/​mlconjug/​feature_extract.py Updates imports and return typing.
src/​verbecc/​core/​mlconjug/​data_set.py Modernizes dataset collection annotations.
src/​verbecc/​core/​mlconjug/​__init__.py Adds ML provenance documentation and metadata.
src/​verbecc/​core/​inflectors/​lang/​ro/​inflector_ro.py Updates Romanian inflector imports and typing.
src/​verbecc/​core/​inflectors/​lang/​ro/​__init__.py Exports Romanian inflector.
src/​verbecc/​core/​inflectors/​lang/​pt/​inflector_pt.py Updates Portuguese inflector imports and typing.
src/​verbecc/​core/​inflectors/​lang/​pt/​__init__.py Exports Portuguese inflector.
src/​verbecc/​core/​inflectors/​lang/​it/​inflector_it.py Updates Italian inflector imports and typing.
src/​verbecc/​core/​inflectors/​lang/​it/​__init__.py Exports Italian inflector.
src/​verbecc/​core/​inflectors/​lang/​fr/​inflector_fr.py Updates typing and impersonal-verb helper name.
src/​verbecc/​core/​inflectors/​lang/​fr/​__init__.py Exports French inflector.
src/​verbecc/​core/​inflectors/​lang/​es/​__init__.py Exports Spanish inflector.
src/​verbecc/​core/​inflectors/​lang/​ca/​inflector_ca.py Updates Catalan inflector imports and typing.
src/​verbecc/​core/​inflectors/​lang/​ca/​__init__.py Exports Catalan inflector.
src/​verbecc/​core/​inflectors/​lang/​__init__.py Relocates language package marker.
src/​verbecc/​core/​inflectors/​inflector_factory.py Uses reorganized language-package exports.
src/​verbecc/​core/​inflectors/​__init__.py Adds relative language-package import.
src/​verbecc/​core/​defs/​types/​tense/​tenses.py Relocates language-specific tense registry.
src/​verbecc/​core/​defs/​types/​tense/​tense.py Relocates base tense enum with version fallback.
src/​verbecc/​core/​defs/​types/​tense/​tense_factory.py Updates tense factory imports.
src/​verbecc/​core/​defs/​types/​tense/​lang/​ro/​tense_ro.py Updates Romanian tense base import.
src/​verbecc/​core/​defs/​types/​tense/​lang/​ro/​__init__.py Exports Romanian tense enum.
src/​verbecc/​core/​defs/​types/​tense/​lang/​pt/​tense_pt.py Updates Portuguese tense base import.
src/​verbecc/​core/​defs/​types/​tense/​lang/​pt/​__init__.py Exports Portuguese tense enum.
src/​verbecc/​core/​defs/​types/​tense/​lang/​it/​tense_it.py Updates Italian tense base import.
src/​verbecc/​core/​defs/​types/​tense/​lang/​it/​__init__.py Exports Italian tense enum.
src/​verbecc/​core/​defs/​types/​tense/​lang/​fr/​tense_fr.py Updates French tense base import.
src/​verbecc/​core/​defs/​types/​tense/​lang/​fr/​__init__.py Exports French tense enum.
src/​verbecc/​core/​defs/​types/​tense/​lang/​es/​tense_es.py Updates Spanish tense base import.
src/​verbecc/​core/​defs/​types/​tense/​lang/​es/​__init__.py Exports Spanish tense enum.
src/​verbecc/​core/​defs/​types/​tense/​lang/​en/​tense_en.py Updates English tense base import.
src/​verbecc/​core/​defs/​types/​tense/​lang/​en/​__init__.py Exports English tense enum.
src/​verbecc/​core/​defs/​types/​tense/​lang/​ca/​tense_ca.py Updates Catalan tense base import.
src/​verbecc/​core/​defs/​types/​tense/​lang/​ca/​__init__.py Exports Catalan tense enum.
src/​verbecc/​core/​defs/​types/​tense/​lang/​__init__.py Relocates tense-language package marker.
src/​verbecc/​core/​defs/​types/​tense/​__init__.py Simplifies relative tense exports.
src/​verbecc/​core/​defs/​types/​pronoun/​pronouns.py Relocates language-specific pronoun registry.
src/​verbecc/​core/​defs/​types/​pronoun/​pronoun.py Relocates base pronoun enum with version fallback.
src/​verbecc/​core/​defs/​types/​pronoun/​pronoun_factory.py Updates pronoun factory imports.
src/​verbecc/​core/​defs/​types/​pronoun/​lang/​ro/​pronoun_ro.py Updates Romanian pronoun base import.
src/​verbecc/​core/​defs/​types/​pronoun/​lang/​ro/​__init__.py Exports Romanian pronoun enum.
src/​verbecc/​core/​defs/​types/​pronoun/​lang/​pt/​pronoun_pt.py Updates Portuguese pronoun base import.
src/​verbecc/​core/​defs/​types/​pronoun/​lang/​pt/​__init__.py Exports Portuguese pronoun enum.
src/​verbecc/​core/​defs/​types/​pronoun/​lang/​it/​pronoun_it.py Updates Italian pronoun base import.
src/​verbecc/​core/​defs/​types/​pronoun/​lang/​it/​__init__.py Exports Italian pronoun enum.
src/​verbecc/​core/​defs/​types/​pronoun/​lang/​fr/​pronoun_fr.py Updates French pronoun base import.
src/​verbecc/​core/​defs/​types/​pronoun/​lang/​fr/​__init__.py Exports French pronoun enum.
src/​verbecc/​core/​defs/​types/​pronoun/​lang/​es/​pronoun_es.py Updates Spanish pronoun base import.
src/​verbecc/​core/​defs/​types/​pronoun/​lang/​es/​__init__.py Exports Spanish pronoun enum.
src/​verbecc/​core/​defs/​types/​pronoun/​lang/​en/​pronoun_en.py Updates English pronoun base import.
src/​verbecc/​core/​defs/​types/​pronoun/​lang/​en/​__init__.py Exports English pronoun enum.
src/​verbecc/​core/​defs/​types/​pronoun/​lang/​ca/​pronoun_ca.py Updates Catalan pronoun base import.
src/​verbecc/​core/​defs/​types/​pronoun/​lang/​ca/​__init__.py Exports Catalan pronoun enum.
src/​verbecc/​core/​defs/​types/​pronoun/​__init__.py Simplifies relative pronoun exports.
src/​verbecc/​core/​defs/​types/​person.py Relocates grammatical-person enum.
src/​verbecc/​core/​defs/​types/​participle_inflection.py Updates grammatical type imports.
src/​verbecc/​core/​defs/​types/​number.py Relocates grammatical-number enum.
src/​verbecc/​core/​defs/​types/​mood/​moods.py Relocates language-specific mood registry.
src/​verbecc/​core/​defs/​types/​mood/​mood.py Relocates base mood enum with version fallback.
src/​verbecc/​core/​defs/​types/​mood/​mood_factory.py Updates mood factory imports.
src/​verbecc/​core/​defs/​types/​mood/​lang/​ro/​mood_ro.py Updates Romanian mood base import.
src/​verbecc/​core/​defs/​types/​mood/​lang/​ro/​__init__.py Exports Romanian mood enum.
src/​verbecc/​core/​defs/​types/​mood/​lang/​pt/​mood_pt.py Updates Portuguese mood base import.
src/​verbecc/​core/​defs/​types/​mood/​lang/​pt/​__init__.py Exports Portuguese mood enum.
src/​verbecc/​core/​defs/​types/​mood/​lang/​it/​mood_it.py Updates Italian mood base import.
src/​verbecc/​core/​defs/​types/​mood/​lang/​it/​__init__.py Exports Italian mood enum.
src/​verbecc/​core/​defs/​types/​mood/​lang/​fr/​mood_fr.py Updates French mood base import.
src/​verbecc/​core/​defs/​types/​mood/​lang/​fr/​__init__.py Exports French mood enum.
src/​verbecc/​core/​defs/​types/​mood/​lang/​es/​mood_es.py Updates Spanish mood base import.
src/​verbecc/​core/​defs/​types/​mood/​lang/​es/​__init__.py Exports Spanish mood enum.
src/​verbecc/​core/​defs/​types/​mood/​lang/​en/​mood_en.py Updates English mood base import.
src/​verbecc/​core/​defs/​types/​mood/​lang/​en/​__init__.py Exports English mood enum.
src/​verbecc/​core/​defs/​types/​mood/​lang/​ca/​mood_ca.py Updates Catalan mood base import.
src/​verbecc/​core/​defs/​types/​mood/​lang/​ca/​__init__.py Exports Catalan mood enum.
src/​verbecc/​core/​defs/​types/​mood/​lang/​__init__.py Relocates mood-language package marker.
src/​verbecc/​core/​defs/​types/​mood/​__init__.py Simplifies relative mood exports.
src/​verbecc/​core/​defs/​types/​lang_specific_options/​lang/​es/​voseo_options.py Relocates Spanish voseo enum.
src/​verbecc/​core/​defs/​types/​lang_specific_options/​lang/​es/​lang_specific_options_es.py Updates Spanish option imports.
src/​verbecc/​core/​defs/​types/​lang_specific_options/​lang/​es/​__init__.py Exports Spanish option types.
src/​verbecc/​core/​defs/​types/​lang_specific_options/​lang/​__init__.py Relocates option-language package marker.
src/​verbecc/​core/​defs/​types/​lang_specific_options/​lang_specific_options.py Relocates language-option interface.
src/​verbecc/​core/​defs/​types/​lang_specific_options/​lang_specific_options_factory.py Updates option factory imports.
src/​verbecc/​core/​defs/​types/​lang_specific_options/​__init__.py Simplifies language-option exports.
src/​verbecc/​core/​defs/​types/​lang_code.py Relocates language-code enum.
src/​verbecc/​core/​defs/​types/​gender.py Relocates grammatical-gender enum.
src/​verbecc/​core/​defs/​types/​exceptions/​verbs_parser_error.py Relocates verbs-parser exception.
src/​verbecc/​core/​defs/​types/​exceptions/​verb_not_found_error.py Relocates missing-verb exception.
src/​verbecc/​core/​defs/​types/​exceptions/​template_not_found_error.py Relocates missing-template exception.
src/​verbecc/​core/​defs/​types/​exceptions/​invalid_tense_error.py Relocates invalid-tense exception.
src/​verbecc/​core/​defs/​types/​exceptions/​invalid_mood_error.py Relocates invalid-mood exception.
src/​verbecc/​core/​defs/​types/​exceptions/​invalid_lang_error.py Relocates invalid-language exception.
src/​verbecc/​core/​defs/​types/​exceptions/​conjugator_error.py Relocates conjugator exception.
src/​verbecc/​core/​defs/​types/​exceptions/​conjugations_parser_error.py Relocates conjugations-parser exception.
src/​verbecc/​core/​defs/​types/​exceptions/​conjugation_template_error.py Relocates template exception.
src/​verbecc/​core/​defs/​types/​exceptions/​__init__.py Re-exports exceptions through relative imports.
src/​verbecc/​core/​defs/​types/​data/​xml_types.py Adds shared lxml type aliases.
src/​verbecc/​core/​defs/​types/​data/​verbs.py Updates imports and verb-list typing.
src/​verbecc/​core/​defs/​types/​data/​verb.py Updates imports and representation formatting.
src/​verbecc/​core/​defs/​types/​data/​tense_template.py Broadens string-compatible grammar annotations.
src/​verbecc/​core/​defs/​types/​data/​person_ending.py Broadens annotations and adds casts.
src/​verbecc/​core/​defs/​types/​data/​mood_template.py Relocates mood-template model.
src/​verbecc/​core/​defs/​types/​data/​element.py Relocates parsed-element interface.
src/​verbecc/​core/​defs/​types/​data/​conjugations.py Updates imports and template-list typing.
src/​verbecc/​core/​defs/​types/​data/​conjugation_template.py Updates imports and mood-map typing.
src/​verbecc/​core/​defs/​types/​conjugation/​verb_info.py Updates serialized-data typing and removes unused state.
src/​verbecc/​core/​defs/​types/​conjugation/​verb_info_data.py Modernizes relocated verb-data alias.
src/​verbecc/​core/​defs/​types/​conjugation/​tense_conjugation.py Updates imports and collection typing.
src/​verbecc/​core/​defs/​types/​conjugation/​tense_conjugation_data.py Modernizes relocated tense-data alias.
src/​verbecc/​core/​defs/​types/​conjugation/​moods_conjugation.py Updates imports and mood-map typing.
src/​verbecc/​core/​defs/​types/​conjugation/​moods_conjugation_data.py Modernizes relocated moods-data alias.
src/​verbecc/​core/​defs/​types/​conjugation/​mood_conjugation.py Adds public mood accessor and modernizes typing.
src/​verbecc/​core/​defs/​types/​conjugation/​mood_conjugation_util.py Replaces direct private-field access.
src/​verbecc/​core/​defs/​types/​conjugation/​mood_conjugation_data.py Modernizes relocated mood-data alias.
src/​verbecc/​core/​defs/​types/​conjugation/​conjugation.py Adds typed indexing overloads and updates slicing.
src/​verbecc/​core/​defs/​types/​conjugation/​conjugation_data.py Modernizes serialized-data aliases.
src/​verbecc/​core/​defs/​types/​conjugation/​complete_conjugation.py Changes mood iteration implementation.
src/​verbecc/​core/​defs/​types/​conjugation/​complete_conjugation_data.py Modernizes relocated complete-data alias.
src/​verbecc/​core/​defs/​types/​conjugation/​abstract_conjugation.py Cleans imports and simplifies parent assignment.
src/​verbecc/​core/​defs/​types/​conjugation/​__init__.py Narrows conjugation re-exports.
src/​verbecc/​core/​defs/​types/​config/​verbecc_config.py Uses YAMLWizard v0 namespace.
src/​verbecc/​core/​defs/​types/​config/​logging/​stream_handler_config.py Updates handler-base import.
src/​verbecc/​core/​defs/​types/​config/​logging/​logging_config.py Relocates and modernizes logging configuration.
src/​verbecc/​core/​defs/​types/​config/​logging/​logger_config.py Modernizes handler-list annotations.
src/​verbecc/​core/​defs/​types/​config/​logging/​handler_config.py Relocates handler configuration model.
src/​verbecc/​core/​defs/​types/​config/​logging/​formatter_config.py Relocates formatter configuration model.
src/​verbecc/​core/​defs/​types/​config/​logging/​file_handler_config.py Updates handler-base import.
src/​verbecc/​core/​defs/​types/​config/​logging/​__init__.py Keeps logging package exports minimal.
src/​verbecc/​core/​defs/​types/​config/​json_opts.py Uses YAMLWizard v0 namespace.
src/​verbecc/​core/​defs/​types/​config/​jsbeautifier_opts.py Uses YAMLWizard v0 namespace.
src/​verbecc/​core/​defs/​types/​__init__.py Relocates types package marker.
src/​verbecc/​core/​defs/​constants/​localization.py Explicitly permits string inputs.
src/​verbecc/​core/​defs/​constants/​grammar_defines.py Updates imports and constant-map annotations.
src/​verbecc/​core/​defs/​constants/​__init__.py Relocates constants package marker.
src/​verbecc/​core/​defs/​__init__.py Relocates definitions package marker.
src/​verbecc/​core/​conjugator/​tense_conjugator.py Updates helper calls, accessors, and API typing.
src/​verbecc/​core/​conjugator/​tense_conjugator_simple.py Exposes simple-tense conjugation helper.
src/​verbecc/​core/​conjugator/​tense_conjugator_compound.py Updates delegation and participle typing.
src/​verbecc/​core/​conjugator/​mood_conjugator.py Updates helper calls and string-input annotations.
src/​verbecc/​core/​conjugator/​conjugator.py Broadens grammatical input annotations.
src/​verbecc/​core/​conjugator/​conjugation_object.py Updates conjugation-context imports.
src/​verbecc/​core/​conjugator/​complete_conjugator.py Updates API typing and adds inflector accessor.
src/​verbecc/​core/​conjugator/​abstract_conjugator.py Renames context helper and modernizes annotations.
src/​verbecc/​core/​conjugator/​__init__.py Re-exports CompleteConjugator.
src/​verbecc/​core/​__init__.py Preserves core conjugator entry point.
src/​verbecc/​config/​verbecc_config.yaml Relocates runtime configuration defaults.
src/​verbecc/​config/​logging_config.yaml Relocates logging configuration defaults.
src/​verbecc/​__init__.py Preserves public conjugator entry point.
setup.py Removes legacy setuptools shim.
setup.cfg Corrects metadata option spelling.
scripts/​__init__.py Adds scripts package marker.
requirements.txt Removes separate dependency listing.
pyproject.toml Updates release, dependencies, packaging, and tooling.
CONTRIBUTING.md Documents uv workflow and consolidated style rules.
CHANGELOG.md Documents release changes and migration details.
.python-version Selects Python 3.14 for development.
.gitignore Ignores uv environments and relocated models.
.github/​workflows/​python-package.yml Uses uv, Python 3.10–3.14, and wheel smoke tests.

Review effort: Balanced

Comment thread src/verbecc/core/utils/xml_utils.py Outdated
elem (XmlElement): The XML element to convert.
Returns:
str: A string representation of the XML element."""
return str(etree.tostring(cast(etree._Element, elem), encoding=encoding, method=method, xml_declaration=xml_declaration, pretty_print=pretty_print)) # type: ignore
Comment thread tests/scripts/test_xml_modifier.py Resolved

@peterabolins peterabolins left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, Brett, and no apology needed.

Re-tested at 412f3f8:

Both blockers fixed. The wheel now ships the data and config, from verbecc import CompleteConjugator works again, and the wheel smoke test in CI should keep it that way.
Romanian output unchanged. All 6,872 Romanian verbs are byte-identical to 2.0.3, from a clean-venv install of the built wheel, apart from pred_score on predicted verbs.
Suite and lint clean. uv sync --locked, ruff and pytest all pass (558 passed, 2 skipped).

Copilot’s xml_utils.py:31 finding reproduces: str(etree.tostring(...)) returns the text of the bytes literal, not decoded XML. In the library it only reaches error messages. scripts/xml_modifier.py does need bytes, though, and currently fails with TypeError on write. Having elem_tobytes call etree.tostring directly, and xml_element_to_string return .decode(encoding), should fix both. It’s not a blocker for me, but it’s worth fixing before release.

Approving from my side.

bretttolbert and others added 3 commits November 8, 2026 09:23
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@bretttolbert
bretttolbert merged commit 8afdd68 into main Nov 8, 2026
5 checks passed
@bretttolbert
bretttolbert deleted the 2.1.0-dev branch November 8, 2026 15:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants